package br.com.faculdade.infrastructure.dao;

import br.com.faculdade.infrastructure.entity.Usuario;
import java.io.Serializable;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.annotations.AutoCreate;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.TransactionPropagationType;
import org.jboss.seam.annotations.Transactional;
import org.jboss.seam.log.Log;
import org.jboss.seam.security.Identity;

/**
 * Classe de acesso aos dados de Usuario
 * @author Kirmaier
 */
@AutoCreate
@Name("usuarioDAO")
@Transactional(TransactionPropagationType.SUPPORTS)
public class UsuarioDAO implements Serializable {

    @In
    private Session reservaDB;
    @Logger
    private Log log;

    public void alterar(Usuario usuario) {
        log.info("Alterando usuario");

        reservaDB.saveOrUpdate(usuario);
        reservaDB.flush();
    }

    public void cancelar() {
        log.info("Cancelando operação");

        reservaDB.flush();
    }

    public void excluir(Usuario usuario) {
        log.info("Excluindo objeto usuario do banco");

        reservaDB.delete(usuario);
    }

    public Usuario obterPorId(Integer idusuario) {
        log.info("Buscando usuario por ID");

        return (Usuario) reservaDB.get(Usuario.class, idusuario);
    }

    public List<Usuario> obterPorParametros(String paramNome, String paramCPF) {
        log.info("Buscando usuários por parametros");

        Criteria c = reservaDB.createCriteria(Usuario.class);
        c.addOrder(Order.asc("nome"));

        if (paramNome != null && !paramNome.isEmpty()) {
            c.add(Restrictions.ilike("nome", paramNome, MatchMode.ANYWHERE));
        }
        if (paramCPF != null && !paramCPF.isEmpty()) {
            c.add(Restrictions.eq("cpf", paramCPF));
        }
        return c.list();
    }

    public Usuario obterUsuario(String password, String username) {
        log.info("Buscando usuario para autenticação");

        Criteria c = reservaDB.createCriteria(Usuario.class);
        c.add(Restrictions.eq("senha", password).ignoreCase());
        c.add(Restrictions.eq("login", username));

        return (Usuario) c.uniqueResult();
    }

    public void salvar(Usuario usuario) {
        log.info("Persistir objeto usuário no banco");

        reservaDB.save(usuario);
        reservaDB.flush();
    }
}
